/*
 * @Author: fzs
 * @LastEditors: fzs
 * @Description: 封装的基于5+app的工具类
 * @Date: 2019-05-10 18:35:00
 */

/**
 * 当前获取定位信息, 返回gcj02类型
 */
export const GETLOCATION = (typeCode = 'gcj02', complete) => {
	return new Promise(function(resolve, reject) {
		uni.getLocation({
			type: typeCode,
			success: (res) => {
				resolve(res);
			},
			fail: (err) => {
				reject(err);
			},
			complete: () => {
				complete && complete();
			}
		});
	}).catch(err=>{
		console.log("定位失败: " + JSON.stringify(err));
	})
}

/**
 * 通过地址信息解析成坐标
 * @param address (string):地址 
 * @param coordType (string):坐标编码类型，默认'gcj02'
 */
export const GEOCODE = (address, coordType = "gcj02") => {
	return new Promise(function(resolve, reject) {
		plus.maps.Map.geocode(address, {
			coordType: coordType
		}, (res) => {
			resolve(res);
		}, (err) => {
			reject(err);
		});
	}).catch(err=>{
		console.log("解析失败: " + JSON.stringify(err));
	});
}

/**
 * 根据坐标逆解析为地址信息
 * @param point (Point):位置坐标
 * @param options (Object):coordType: (String 类型 )源数据的坐标系类型
仅在反向地理编码转换时生效。 “wgs84”：表示WGS-84坐标系； “gcj02”：表示国测局经纬度坐标系； “bd09”：表示百度墨卡托坐标系； “bd09ll”：表示百度经纬度坐标系； 默认使用wgs84坐标系。
city: (String 类型 )源地址所属的城市
仅在地理编码转换时生效，如果不指定则在全国范围内区配转换。
 */
export const REVERSEGEOCODE = (point, options) => {
	let o = {
		coordType: 'gcj02'
	};
	options = Object.assign(o, options);
	return new Promise(function(resolve, reject) {
		plus.maps.Map.reverseGeocode(point, options, (res) => {
				resolve(res);
			},
			(err) => {
				reject(err);
			}
		);
	}).catch(err=>{
		console.log("逆解析失败: " + JSON.stringify(err));
	});
}

/**
 * 计算从pointStart坐标点到pointEnd坐标的实际直线距离，单位为米（m）
 * @param pointStart ( Point ):起始坐标点
 * @param pointEnd ( Point ):终点坐标点
 */
export const CALCULATEDISTANCE = (pointStart, pointEnd) => {
	return new Promise(function(resolve, reject) {
		plus.maps.Map.calculateDistance(pointStart, pointEnd,
			(res) => {
				resolve(res);
			},
			(err) => {
				reject(err);
			}
		);
	}).catch(err=>{
		console.log("计算失败: " + JSON.stringify(err));
	});
}

/**
 * 调用系统第三方程序进行导航
 * @param  dst: ( Point ) 必选 导航目的地坐标,要求使用WGS-84坐标系值，即GPS获取的值。
 * @param  des: ( String ) 必选 导航目的地描述
 * @param  src: ( Point ) 必选 导航起始坐标,要求使用WGS-84坐标系值，即GPS获取的值
 */
export const OPENSYSMAP = (dst, des, src) => {
	let end = new plus.maps.Point(dst.longitude,dst.latitude);
	let start = new plus.maps.Point(src.longitude,src.latitude);
	plus.maps.openSysMap(end, des, start);
}

/**
 * 指定坐标类型转化坐标系,默认转化成'gcj02'，此方法只支持百度地图
 * @param point: ( Point ) 必选 要转换的坐标  
 * @param coordType: (String 类型 )源数据的坐标系类型
 */
export const CONVERTCOORDINATES = (point, coordType = 'gcj02') => {
	return new Promise(function(resolve, reject) {
		plus.maps.Map.convertCoordinates(point, {
				coordType: coordType
			},
			(res) => {
				resolve(res);
			},
			(err) => {
				reject(err);
			});
	}).catch(err=>{
		console.log("转化失败: " + JSON.stringify(err));
	});
}
/**
 * 检测设备是否支持指纹识别
 */
export const ISFINGERPRINT = () => {
	let msg = ''
	if (plus.fingerprint) {
		if (!plus.fingerprint.isSupport()) {
			msg = '此设备不支持指纹识别';
			return {
				result: false,
				msg: msg
			};
		}
		if (!plus.fingerprint.isKeyguardSecure()) {
			msg = '此设备未设置密码锁屏，无法使用指纹识别';
			return {
				result: false,
				msg: msg
			};
		}
		if (!plus.fingerprint.isEnrolledFingerprints()) {
			msg = '此设备未录入指纹，请到设置中开启';
			return {
				result: false,
				msg: msg
			};
		}
		msg = '此设备支持指纹识别';
		return {
			result: true,
			msg: msg
		};
	} else {
		msg = '当前环境不支持指纹识别API，请更新到最新版本';
		return {
			result: false,
			msg: msg
		};
	}
}

/**
 * 指纹识别成功请用===判断为true,既识别成功。不成功则返回错误信息
 */
export const FINGERPRINT = () => {
	return new Promise(function(resolve, reject) {
			plus.fingerprint.authenticate(function() {
					resolve(true);
				},
				function(e) {
					let msg = '';
					switch (e.code) {
						case e.AUTHENTICATE_MISMATCH:
							msg = '指纹匹配失败，请重新输入';
							break;
						case e.AUTHENTICATE_OVERLIMIT:
							msg = '指纹识别失败次数超出限制，请使用其它方式进行认证';
					break;
					default:
					msg = '指纹识别失败(' + e.code + ')，请重试';
					break;
				}
				reject(msg);
			});
	}).catch(err=>{
		console.log("指纹识别错误: " + JSON.stringify(err));
	});
}


